<?php

/**
 * SmartPHP framework
 *
 * @name SmartPHP framework
 * @package SmartPHP
 * @author 费尔 <admin@smartphp.cn>
 * @version 1.0 Beta
 * @link http://www.smartphp.cn
 * @copyright smartphp.cn
 * @license <a href="http://www.smartphp.cn">smartphp</a>
 */

namespace Base;

/**
 * 控制器
 *
 * @author 费尔 <admin@smartphp.cn>
 */
abstract class Controller {

    /**
     * 赋值
     * @access protected
     * @param string|array $var
     * @param mixed $value
     */
    protected function assign($var, $value = NULL) {
        return $this->view()->assign($var, $value);
    }

    /**
     * 获取模板变量
     * @access protected
     * @param string $name
     * @return NULL|mixed
     */
    protected function getVar($name = '') {
        return $this->view()->getVar($name);
    }

    /**
     * 清除全部赋值
     * @access protected
     */
    protected function clearAllAssign() {
        $this->view()->clearAllAssign();
    }

    /**
     * 清除所有模板缓存
     * @access protected
     * @param string ...$template
     */
    protected function clearAllCache() {
        $this->view()->clearAllCache();
    }

    /**
     * 清除所有模板编译
     * @access protected
     * @param string ...$template
     */
    protected function clearAllCompile() {
        $this->view()->clearAllCompile();
    }

    /**
     * 清除模板缓存
     * @access protected
     * @param string ...$template
     */
    protected function clearCache(...$template) {
        $this->view()->clearCache($template);
    }

    /**
     * 清除模板编译
     * @access protected
     * @param string ...$template
     */
    protected function clearCompile(...$template) {
        $this->view()->clearCompile($template);
    }

    /**
     * 清除赋值
     * @access protected
     * @param string ...$vars
     */
    protected function clearAssign(...$vars) {
        $this->view()->clearAssign($vars);
    }

    /**
     * 取得输出内容
     * @access protected
     * @param string $template
     * @return string
     */
    protected function fetch($template = '') {
        return $this->view()->fetch($template);
    }

    /**
     * 显示输出内容
     * @access protected
     * @param string $template
     */
    protected function display($template = '') {
        $this->view()->display($template);
    }

    /**
     * 启动缓存 默认配制参数(单位秒) 0永远缓存 缓存一个小时：3600
     * @access protected
     * @param int $time
     */
    protected function inCache($time = NULL) {
        $this->view()->inCache($time);
    }

    /**
     * 检测是否被缓存
     * @access protected
     * @param string $template
     * @return boolean
     */
    protected function isCache($template = '') {
        return $this->view()->isCache($template);
    }

    /**
     * 是否开启视图模板布局
     * @access protected
     * @param string $layout 定义是否开启视图模板布局入口文件名 如：Public:layout
     */
    protected function layout($layout = '') {
        if (!empty($layout)) {
            Config::set('view.layout', true);
            Config::set('view.layoutname', $layout);
        } else
            Config::set('view.layout', false);
    }

    /**
     * 操作错误跳转的快捷方法
     * @access protected
     * @param string $message 错误信息
     */
    protected function error($message, $url = '') {
        $this->ajaxReturn($message, 0, '', $url);
    }

    /**
     * 操作成功跳转的快捷方法
     * @access protected
     * @param string $message 提示信息
     */
    protected function success($message, $url = '') {
        $this->ajaxReturn($message, 1, '', $url);
    }

    /**
     * Ajax方式返回数据到客户端
     * @access protected
     * @param mixed $data 要返回的数据
     * @param String $info 提示信息
     * @param boolean $status 返回状态
     */
    protected function ajaxReturn($info = '', $status = 1, $data = '', $url = '') {
        $result = [];
        $result['status'] = (int) $status;
        if (is_string($info))
            $result['info'] = $info;
        $result['url'] = $url ?: '';
        if (!empty($data))
            $result['data'] = $data;
        if (is_array($info))
            $result['data'] = $info;
        if (Request::isAjax()) {
            $this->showAjax($result);
        } else {
            $this->assign('result', $result);
            exit(!empty($result['status']) ? $this->display(':success') : $this->display(':error'));
        }
    }

    /**
     * 输出Ajax
     * @access protected
     * @param array $result
     */
    protected function showAjax($result) {
        header('Content-type:application/json;charset=utf-8');
        exit(json_encode($result));
    }

    public function __set($name, $value) {
        $this->assign($name, $value);
    }

    /**
     * 取得模板显示变量的值
     * @access protected
     * @param string $name 模板显示变量
     * @return mixed
     */
    public function get($name = '') {
        return $this->view()->getVar($name);
    }

    public function __get($name) {
        return $this->get($name);
    }

    /**
     * 检测模板变量的值
     * @access public
     * @param string $name 名称
     * @return boolean
     */
    public function __isset($name) {
        return $this->get($name);
    }

    /**
     * 实例视图控制器
     * @access protected
     * @staticvar \Base\View $view
     * @return \Base\View
     */
    protected function view() {
        return Loader::view();
    }

    /**
     * 解析URL
     * @access protected
     * @param string $url
     * @param array $params
     * @return string
     */
    protected function url($url, $params = []) {
        return Url::parse($url, $params);
    }

    /**
     * 获取语言定义(不区分大小写)
     * @access protected
     * @param string|null   $name 语言变量
     * @param array         $vars 变量替换
     * @return mixed
     */
    protected function lang($name = null, $vars = []) {
        return Lang::get($name, $vars);
    }

    /**
     * 获取配置参数 为空则获取所有配置
     * @access protected
     * @param string    $name 配置参数名（支持二级配置 .号分割）
     * @return mixed
     */
    public static function config($name = null) {
        return Config::get($name);
    }

    /**
     * 实例模型
     * @access public
     * @param string $table
     * @param string $prefix
     * @param string $dsn
     * @param string $user
     * @param string $password
     * @param array $params
     * @param string $prefix
     * @param string $keyquote
     * @return model
     */
    public static function model($table = '', $prefix = '', $dsn = '', $user = '', $password = '', $params = [], $keyquote = '') {
        return Loader::model($table, $prefix, $dsn, $user, $password, $params, $keyquote);
    }

    /**
     * URL重定向
     * @access protected
     * @param string $url 跳转的URL表达式
     * @param array $params 其它URL参数
     * @param string $msg 跳转提示信息
     */
    protected function redirect($url, $params = []) {
        Loader::redirect(Url::parse($url, $params));
    }

}
